<?php
/**
 * EAjaxUpload class file.
 * This extension is a wrapper of http://valums.com/ajax-upload/
 *
 * @author Vladimir Papaev <kosenka@gmail.com>
 * @version 0.1
 * @license http://www.opensource.org/licenses/bsd-license.php
 */
/**
How to use:

view:
$this->widget('ext.EAjaxUpload.EAjaxUpload',
array(
'id'=>'uploadFile',
'config'=>array(
'action'=>'/controller/upload',
'allowedExtensions'=>array("jpg"),//array("jpg","jpeg","gif","exe","mov" and etc...
'sizeLimit'=>10*1024*1024,// maximum file size in bytes
'minSizeLimit'=>10*1024*1024,// minimum file size in bytes
//'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }",
//'messages'=>array(
//                  'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.",
//                  'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.",
//                  'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.",
//                  'emptyError'=>"{file} is empty, please select files again without it.",
//                  'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled."
//                 ),
//'showMessage'=>"js:function(message){ alert(message); }"
)
));

controller:

public function actionUpload()
{
Yii::import("ext.EAjaxUpload.qqFileUploader");

$folder='upload/';// folder for uploaded files
$allowedExtensions = array("jpg"),//array("jpg","jpeg","gif","exe","mov" and etc...
$sizeLimit = 10 * 1024 * 1024;// maximum file size in bytes
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
$result = $uploader->handleUpload($folder);
$result=htmlspecialchars(json_encode($result), ENT_NOQUOTES);
echo $result;// it's array
}

 */
class EAjaxUpload extends CWidget
{
    public $id = "fileUploader";
    public $postParams = array();
    public $config = array();
    public $css = null;

    public function run()
    {
        if (empty($this->config['action'])) {
            throw new CException('EAjaxUpload: param "action" cannot be empty.');
        }
        if (empty($this->config['allowedExtensions'])) {
            throw new CException('EAjaxUpload: param "allowedExtensions" cannot be empty.');
        }
        if (empty($this->config['sizeLimit'])) {
            throw new CException('EAjaxUpload: param "sizeLimit" cannot be empty.');
        }
        unset($this->config['element']);
        echo '<div id="' . $this->id . '"><noscript><p>Please enable JavaScript to use file uploader.</p></noscript></div>';
        $assets = dirname(__FILE__) . '/assets';
        $baseUrl = Yii::app()->assetManager->publish($assets);
        Yii::app()->clientScript->registerScriptFile($baseUrl . '/fileuploader.js', CClientScript::POS_HEAD);
        $this->css = (!empty($this->css)) ? $this->css : $baseUrl . '/fileuploader.css';
        Yii::app()->clientScript->registerCssFile($this->css);
        $postParams = array('PHPSESSID' => session_id(), 'YII_CSRF_TOKEN' => Yii::app()->request->csrfToken);
        if (isset($this->postParams)) {
            $postParams = array_merge($postParams, $this->postParams);
        }
        $config = array(
            'element' => 'js:document.getElementById("' . $this->id . '")',
            'debug' => false,
            'multiple' => false
        );
        $config = array_merge($config, $this->config);
        $config['params'] = $postParams;
        $config = CJavaScript::encode($config);
        Yii::app()->getClientScript()->registerScript("FileUploader_" . $this->id, "var FileUploader_" . $this->id . " = new qq.FileUploader($config); ", CClientScript::POS_LOAD);
    }
}